/* **************************************************
 * Archivo: TP3C1A2010.c                            *
 * Fecha: 05/06/2010                                *
 * Autor: Ariel Liguori                             *
 *                                                  *
 * **************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "TDAListaDestinatarios.h"
#include "TDAClienteCorreo.h"
#include "TDACorreo.h"
#include "TDACanalSeguro.h"
#include "TDAServidorInseguro.h"
#include "logdebug.h"
#include "TDA_AB.h"
#include "TDA_DNS.h"


/* Definicion de funciones auxiliares */
void generarClaveRandom(char* clave);
int strEnArray(char auxDest[100][100], char *destinatario, int qty);
void parser_config(char *filename,char dominios[30][100],char clientes[40][100],char clave[100], int *qtyClientes, int *qtyDominios);
void agregarQtyDominios(TDA_DNS *DNS, int qtyDominios, char dominios[MAX_QTY_DOMINIOS][MAX_DOMINIO_SIZE]);
int enlazarServerDestConDominio(TDA_DNS *DNS, TDAServidorInseguro **server,char destinatario[MAX_ADDR_SIZE]);
int generaClientesCorreo(TDA_DNS *DNS, TDAClienteCorreo *clientesCorreo, char clientes[50][100], int qtyClientes, TDACanalSeguro *canalSeguro);
int enviarCorreos(int argc, char **argv, TDAClienteCorreo *emisor);
int getTodosCorreosDestinatario(TDAClienteCorreo *clientesCorreo, int qtyClientes);
void escribirLogServers(TDA_DNS DNS, char dominios[MAX_QTY_DOMINIOS][MAX_DOMINIO_SIZE], int qtyDominios);
void esribirLogServerDNS(TDA_DNS DNS);


int main(int argc, char **argv) {

    TDA_DNS DNS;
	TDAClienteCorreo emisor;
    TDAClienteCorreo *clientesCorreo = NULL;
	TDACanalSeguro canalSeguro;
    TDAServidorInseguro *server = NULL;

    char clave[MAX_KEY_LEN]={0};
 	char dominios[50][100]={{0}};
 	char clientes[50][100]={{0}};
    int qtyDominios = 0, qtyClientes = 0;


    /* Realizo un parse a la configuracion para obtener los valores necesarios */
    parser_config(argv[1],dominios,clientes,clave,&qtyClientes,&qtyDominios);

    /* Creo el DNS */
    crearDNS(&DNS);

    /* agrego al arbol DNS los dominios encontrados */
    agregarQtyDominios(&DNS,qtyDominios,dominios);

    /* Creo el canal seguro y guardo la clave en el */
    crearCanalSeguro(&canalSeguro);
    setContenido(&canalSeguro, clave);

    /* Reservo memoria para la cantidad de clientes de correo correspondiente
     * a la cantidad de destinatarios que encontre. */
    clientesCorreo = (TDAClienteCorreo*) malloc( (qtyClientes*sizeof(TDAClienteCorreo)) );

    /* Seteo la direccion de server del remitente por defecto */
    if ( enlazarServerDestConDominio(&DNS,&server,DEFAULT_RMT) == EXIT_FAILURE )
        return EXIT_FAILURE;

    /* Creo el emisor y le seteo la clave */
    crearClienteCorreo(&emisor,DEFAULT_RMT);
    obtenerClave(&emisor, canalSeguro);

    /* Conecto el emisor con su correspondiente servidor de correo */
    if ( conectar(&emisor, server) ){
        logmacro("\n%s\n","No fue posible conectar el emisor al servidor");
        return EXIT_FAILURE;
    }

    /* Obtengo la clave, seteo la direccion del dest. y conecto al server*/
    if ( generaClientesCorreo(&DNS, clientesCorreo,clientes,qtyClientes, &canalSeguro) )
        return EXIT_FAILURE;

    /* Envio todos los correos pasados por argumento al programa */
    if ( enviarCorreos(argc,argv,&emisor) )
        return EXIT_FAILURE;

    /* Elimino el contenido del canal seguro */
    eliminarContenido(&canalSeguro);

    /* Obtengo los correos de todos los destinatarios definidos */
    if ( getTodosCorreosDestinatario(clientesCorreo,qtyClientes) )
        return EXIT_FAILURE;

    /* Escribo los logs de los servidores de correo y DNS */
    escribirLogServers(DNS,dominios,qtyDominios);
    esribirLogServerDNS(DNS);

    /* Destruyo todos los objetos de memoria */
    destruirCanalSeguro(&canalSeguro);
    destruirClienteCorreo(&emisor);
    destruirDNS(&DNS);
    free (clientesCorreo);


    return EXIT_SUCCESS;
}

